#ifndef TCPCLIENT_H
#define TCPCLIENT_H

#include <QDialog>
#include <QTcpServer>
#include <QFile>
#include <QElapsedTimer>
#include <QTcpSocket>

namespace Ui {
class TcpClient;
}

class TcpClient : public QDialog
{
    Q_OBJECT

public:
    // 显式构造函数，可接收一个父部件指针，默认为 nullptr
    explicit TcpClient(QWidget *parent = nullptr);
    // 析构函数
    ~TcpClient();
    // 设置远程服务器的主机地址
    void setHostAddress(QHostAddress address);
    // 设置要接收的文件名
    void setFileName(QString fileName);

protected:
    // 重写关闭事件处理函数，当窗口关闭时调用
    void closeEvent(QCloseEvent *);

private:
    // UI 指针，用于操作界面元素
    Ui::TcpClient *ui;
    // TCP 客户端套接字，用于与服务器通信
    QTcpSocket *tcpClient;
    // 数据块大小，可能用于数据传输中的块大小控制
    quint16 blockSize;
    // 存储远程服务器的主机地址
    QHostAddress hostAddress;
    // TCP 端口号
    qint16 tcpPort;
    // 总共要接收的字节数
    qint64 TotalBytes;
    // 已经接收到的字节数
    qint64 bytesReceived;
    // 待接收的字节数
    qint64 bytesToReceive;
    // 文件名的大小
    qint64 fileNameSize;
    // 存储要接收的文件名
    QString fileName;
    // 本地文件对象，用于存储接收到的文件
    QFile *localFile;
    // 存储接收到的数据块
    QByteArray inBlock;
    // 用于计算时间的定时器，可用于测量文件接收时间等
    QElapsedTimer time;

private slots:
    // 发起新连接的槽函数
    void newConnect();
    // 读取服务器发送的消息的槽函数
    void readMessage();
    // 显示 TCP 客户端发生的错误
    void displayError(QAbstractSocket::SocketError);
    // 当点击取消按钮时调用的槽函数
    void on_tcpClientCancelBtn_clicked();
    // 当点击关闭按钮时调用的槽函数
    void on_tcpClientCloseBtn_clicked();
};

#endif // TCPCLIENT_H
